package com.zjs.utils.crud;


import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;


import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.zjs.common.annotation.FillFieldAnnotation;
import com.zjs.enums.FillTypeEnum;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;

import java.util.Date;
import java.util.Objects;

/**
 * @author zhengJianSheng
 * &#064;date 2022-07-27 21:36
 */
public class CrudUtils {

    /**
     * 填充Bean公用对象
     *
     * @param entity 填充对象
     * @param isInsert   是否是新增
     * @param <T>
     */
    public static <T> void fillEntityField(T entity, boolean isInsert) {

        /*

        Class<?> cls = entity.getClass();
        Field[] fields = cls.getDeclaredFields();
        FillFieldAnnotation fillFieldAnnotation = field.getAnnotation(FillFieldAnnotation.class);


        *  */
        // 获取class
        Class<?> cls = entity.getClass();
        // 获取字段列表
        Field[] fields = cls.getDeclaredFields();
        // 遍历字段列表
        for (Field field : fields) {
            // 1.获取修改相关的注解
            FillFieldAnnotation fillFieldAnnotation = field.getAnnotation(FillFieldAnnotation.class);
            if (fillFieldAnnotation == null) {
                continue;
            }
            // 取注解的值和类型
            String value = fillFieldAnnotation.value();
            FillTypeEnum type = fillFieldAnnotation.fillType();
            boolean fillIsInsert = fillFieldAnnotation.isInsert();
            // 2.判断是否是新增的，新增填充修改、新增，修改填充修改
            if (isInsert) {
            //    填充所有字段
                fillByType(entity, field, value, type);
            } else if(!fillIsInsert){
            //    填充修改的字段
                fillByType(entity, field, value, type);
            }
        }
    }

    /**
     * 为标记填充注解的字段填充值
     * @param entity 填充对象
     * @param field 填充的字段
     * @param value 填充的值
     * @param type 填充类型枚举
     * @param <T> 泛型
     */
    private static <T> void fillByType(T entity, Field field, String value, FillTypeEnum type) {
        // 根据type修改相关值
        switch (type) {
            // 日期类型：字段值：set当前时间
            case DATE:
                field.setAccessible(true);
                ReflectionUtils.setField(field, entity, new Date());
                break;
            //    职工id：字段值：set员工id
            case STAFF_ID:
                field.setAccessible(true);
                ReflectionUtils.setField(field, entity, "工具ID");
                break;
            //    职工名字：字段值：set员工名字
            case STAFF_NAME:
                field.setAccessible(true);
                ReflectionUtils.setField(field, entity, "工具名称");
                break;
            //    string类型：字段值set value
            case STRING:
                field.setAccessible(true);
                ReflectionUtils.setField(field, entity, value);
                break;
            //    integer类型：字段值set Integer.parseInt(value)
            case INTEGER:
                field.setAccessible(true);
                ReflectionUtils.setField(field, entity, Integer.parseInt(value));
                break;
            //    其他略过
            default:
                break;
        }
    }


    /**
     * 根据逻辑删除注解，查看相关字段名
     * 注解=>field=>tableInfo=>fieldName
     *
     * @param
     * @return
     */
    public static String getColumnByTableLogic(Object entity) {
        // 获取class
        Class<?> cls = entity.getClass();
        TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);

        if (tableInfo == null) {
            return null;
        }
        // 获取字段列表
        Field[] fields = cls.getDeclaredFields();
        // 遍历字段列表
        for (Field field : fields) {
            // 获取逻辑删除相关的注解
            TableLogic updateField = field.getAnnotation(TableLogic.class);
            if (updateField == null) {
                continue;
            }
            for (TableFieldInfo tableFieldInfo : tableInfo.getFieldList()) {
                // 比较注解的字段名称和属性
                if (Objects.equals(field.getName(), tableFieldInfo.getProperty())) {
                    return tableFieldInfo.getColumn();
                }
            }
        }
        return null;
    }
}
